# @Time : 2024-12-24 17:58
# @Author : Fioman 
# @Phone : 13149920693
"""
eap日志记录模块,使用模块去实现
"""
import logging
import os
import re
import threading
import time
from datetime import datetime, timedelta

import app_config
from common.datetime_helper import get_date_only

# 使用全局变量表示_logger是否初始化
_lock = threading.Lock()
_isPrint = True  # 是否输出到控制台
_logger = None
_lastCheckDate = None


def log_init():
    """
    初始化日志模块,返回一个logger对象
    :return:
    """
    global _logger, _lastCheckDate
    if _logger is None:
        with _lock:
            temp_logger = logging.getLogger(__name__)
            for hdlr in temp_logger.handlers[:]:
                temp_logger.removeHandler(hdlr)
                hdlr.close()
            _logger = temp_logger
            _logger.setLevel(logging.DEBUG)
            logFile = (f"{os.path.join(app_config.prodDebugDir, get_date_only())}"
                       f"_{app_config.projectName}_log.txt")
            # 将日志输出到文件,并自动切割日志. when="midnight"表示切割时间间隔midnight午夜切割
            handler = logging.FileHandler(logFile, encoding="utf-8")
            handler.setLevel(logging.DEBUG)
            formatter = logging.Formatter("%(asctime)s - %(message)s")
            handler.setFormatter(formatter)
            _logger.addHandler(handler)
            _lastCheckDate = get_date_only()
    return _logger


def check_over_days_log():
    """
    检查
    :return:
    """

    # 3. 获取所有符合格式的日志文件
    log_files = []
    pattern = re.compile(r'^\d{4}-\d{2}-\d{2}_' + app_config.projectName + r'_log\.txt$')
    for f in os.listdir(app_config.prodDebugDir):
        if pattern.match(f):
            log_files.append(f)

    # 4. 按文件名中的日期排序（旧文件在前）
    log_files.sort()

    # 5. 计算保留阈值日期（超过该日期的文件需删除）
    threshold_date = datetime.now() - timedelta(days=app_config.overdueDays)

    # 6. 遍历并删除过期文件
    for filename in log_files:
        # 提取日期部分
        date_str = filename.split('_')[0]
        file_date = datetime.strptime(date_str, "%Y-%m-%d")

        if file_date < threshold_date:
            file_path = os.path.join(app_config.prodDebugDir, filename)
            try:
                os.remove(file_path)
                debug_produce(f"已删除过期日志: {filename}")
            except PermissionError:
                debug_produce(f"权限不足，无法删除: {filename}")
            except Exception as e:
                debug_produce(f"删除失败[{filename}]: {str(e)}")


def create_new_log_file():
    """
    创建新的日志文件,并且删除掉旧的文件目录,根据overDays删除旧的日志文件.
    根据时间去排序.
    :return:
    """
    global _logger
    check_over_days_log()
    _logger = None
    return log_init()


def debug_produce(info: str, isOnlyPrint: bool = False):
    """
    输出日志到文件和控制台
    @param info:
    @param isOnlyPrint:是否仅仅是打印
    @return:
    """
    logger = log_init()
    today = get_date_only()
    if _lastCheckDate and today != _lastCheckDate:
        logger = create_new_log_file()
        check_over_days_log()
    # 根据标志为是否输出到控制台
    if _isPrint:
        print(info)
    if not isOnlyPrint:
        logger.debug(info)


if __name__ == '__main__':
    for i in range(10):
        debug_produce("我是一只小小鸟")
        time.sleep(1)
